import os
import sys
import logging
import subprocess
from datetime import datetime

# 配置日志
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
    handlers=[
        logging.FileHandler('database_initialization.log'),
        logging.StreamHandler()
    ]
)
logger = logging.getLogger('database_initializer')

def run_script(script_name):
    """运行指定的Python脚本"""
    logger.info(f"开始执行脚本: {script_name}")
    start_time = datetime.now()
    
    try:
        # 获取当前工作目录
        current_dir = os.path.dirname(os.path.abspath(__file__))
        # 构建脚本路径，指向init_scripts文件夹
        script_path = os.path.join(current_dir, 'init_scripts', script_name)
        
        # 运行脚本，设置PYTHONPATH环境变量以确保能找到database模块
        env = os.environ.copy()
        env['PYTHONPATH'] = current_dir + os.pathsep + env.get('PYTHONPATH', '')
        
        result = subprocess.run(
            [sys.executable, script_path],
            check=True,
            capture_output=True,
            text=True,
            cwd=current_dir,
            env=env
        )
        
        # 记录脚本输出
        if result.stdout:
            logger.info(f"脚本 {script_name} 输出:\n{result.stdout}")
        if result.stderr:
            logger.warning(f"脚本 {script_name} 警告输出:\n{result.stderr}")
        
        end_time = datetime.now()
        elapsed_time = (end_time - start_time).total_seconds()
        logger.info(f"脚本 {script_name} 执行完成，耗时: {elapsed_time:.2f} 秒")
        return True
    except subprocess.CalledProcessError as e:
        logger.error(f"脚本 {script_name} 执行失败，退出码: {e.returncode}")
        logger.error(f"错误输出:\n{e.stderr}")
        return False
    except Exception as e:
        logger.error(f"执行脚本 {script_name} 时发生异常: {str(e)}")
        return False

def initialize_database():
    """按顺序初始化数据库，调用所有init_*.py脚本"""
    logger.info("=== 开始数据库初始化过程 ===")
    
    # 定义初始化脚本的执行顺序
    # 先初始化基础数据（部门、角色、菜单等）
    # 然后初始化依赖这些基础数据的数据
    scripts = [
        'init_departments.py',          # 部门数据
        'init_roles.py',                # 角色数据
        'init_menus.py',                # 菜单数据
        'init_dicts.py',                # 字典数据
        'init_no_fly_zones.py',         # 禁飞区数据
        'init_drone_types.py',          # 无人机类型数据
        'init_drones.py',               # 无人机数据        
        'init_users.py',                # 用户数据（需要在routes之前初始化）
        'init_routes.py',               # 路由数据（需要无人机和用户数据）
        'init_detection_targets.py',    # 检测目标数据      
        'init_detection_models.py',     # 检测模型数据
        'init_task_scenarios.py',       # 任务场景数据   
        'add_test_logs.py'              # 添加测试Log数据
    ]
    
    # 创建备份提示
    logger.warning("注意：此操作将初始化数据库。如果您需要保留现有数据，请先备份数据库文件(pilot_manage.db)！")
    
    # 执行所有脚本
    success_count = 0
    failed_count = 0
    
    for script in scripts:
        if run_script(script):
            success_count += 1
        else:
            failed_count += 1
            # 可以选择是否在失败时继续执行其他脚本
            logger.warning("继续执行其他初始化脚本...")
    
    # 总结初始化结果
    logger.info("=== 数据库初始化过程完成 ===")
    logger.info(f"成功执行脚本数量: {success_count}")
    logger.info(f"失败执行脚本数量: {failed_count}")
    
    if failed_count > 0:
        logger.error("数据库初始化过程中有脚本执行失败，请查看日志获取详细信息。")
    else:
        logger.info("数据库初始化过程全部成功完成！")

if __name__ == "__main__":
    initialize_database()
    print("数据库初始化过程已完成，请查看日志获取详细信息。")